﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Windows;
using InnvoiceActual.Logica.GestorObject.Articulo;
using InnvoiceActual.Logica.GestorDB;



namespace InnvoiceActual.Logica.GestorObject.Factura
{
    public class Facturero : INotifyPropertyChanged, IDataErrorInfo
    {

        private IFormatProvider _english = new System.Globalization.CultureInfo("en-us");

        byte codigo_empresa;	//tinyint(2)		
	    short nro_comprobante1;	//smallint(4)		
	    int nro_comprobante2;	//int(8)		
        int TipoFactura;        //tinyint(3)	
        string DetalleTipoFact {set; get;}
	    DateTime fechaFactura;
        byte Anulada { set; get; }
        byte Impresa { set; get; }
        byte Estado { set; get; }
        public CabeceraFactura Cabecera { set; get; }
        private List<ItemsFactura> _listaItem;
        private ItemsFactura _facturaItem;
        public PieFactura Pie { set; get; }
        

        //variables para llenado de la ventana de facturar
        private ClienteCS _tempCliente { set; get; } //guarda temporalmente el dato del cliente al cual le hago la factura        
        private UnicodigoArticulo _subArticulo;
        public Dictionary<decimal, decimal> SubTotalesIva = new Dictionary<decimal, decimal>();
        UnicodigoArticuloDB _unicodigo;
        ConfigFactura _configFactura;


        //no tengo ni idea de como hacer lo del iva.........
        private decimal _iva105;
        private decimal _iva210;
        //fin

        #region Property
        public event PropertyChangedEventHandler PropertyChanged;


        public string Error
        {
            get
            {
                return null;
            }
        }

        public string this[string propertyName]
        {
            get
            {
                return IsValid(propertyName);
            }
        }

        public UnicodigoArticuloDB UniCodigo
        {
            get
            {
                return _unicodigo;
            }
            set
            {
                _unicodigo = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("UniCodigo"));
            }
        }


        public ItemsFactura FacturaItem
        {
            get
            {
                return _facturaItem;
            }
            set
            {
                _facturaItem = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("FacturaItem"));
            }
        }

        public List<ItemsFactura> ListaItem
        {
            get
            {
                return _listaItem;
            }
            set
            {
                _listaItem = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ListaItem"));
            }
        }

        public ClienteCS TempCliente
        {
            get
            {
                return _tempCliente;
            }
            set
            {
                _tempCliente = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("TempCliente"));
            }
        }

        //public decimal Subtotal
        //{
        //    get
        //    {
        //        return _subtotal;
        //    }
        //    set
        //    {
        //        _subtotal = value;
        //        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Subtotal"));
        //    }
        //}

        public byte CodigoEmpresa
        {
            get
            {
                return codigo_empresa;
            }
            set
            {
                codigo_empresa = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("CodigoEmpresa"));
            }
        }
        public short Comprobante1
        {
            get
            {
                return nro_comprobante1;
            }
            set
            {
                nro_comprobante1 = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Comprobante1"));
            }
        }
        public int Comprobante2
        {
            get
            {
                return nro_comprobante2;
            }
            set
            {
                nro_comprobante2 = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Comprobante2"));
            }
        }
        public DateTime FechaFactura
        {
            get
            {
                return fechaFactura;
            }
            set
            {
                fechaFactura = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("FechaFactura"));
            }
        }


        #endregion Property 

        #region constructor

        public Facturero()
        {
            codigo_empresa = 0;	    //tinyint(2)		
            nro_comprobante1 = 0;	//smallint(4)		
            nro_comprobante2 = 0;	//int(8)		
            TipoFactura = 0;        //tinyint(3)	
            DetalleTipoFact = "";
            fechaFactura = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
            Anulada = 0;
            Impresa = 0;
            Estado = 0;
            Cabecera = new CabeceraFactura();
            ListaItem = new List<ItemsFactura>();
            Pie = new PieFactura();
            TempCliente = new ClienteCS();
            //Subtotal = 0; 
            //setea la lista de codigo...........................<<<<< mirar con mas detenimiento
            _unicodigo = UnicodigoArticuloDB.Instance;
            _facturaItem = new ItemsFactura();
            _configFactura = new ConfigFactura();
            _iva105 = 0;
            _iva210 = 0;
        }

        #endregion constructor

        #region metodos de validacion

        private string IsValid(string propertyName)
        {
            switch (propertyName)
            {
                case "RazonSocial":
                    if (string.IsNullOrWhiteSpace(DetalleTipoFact))
                        return "El campo Razon Social es requerido";
                    else if (10 > DetalleTipoFact.Length)
                        return "El campo Razon Social debe " +
                            "contener más de 10 caracteres";
                    break;
                //case "Responsable":
                //    if (string.IsNullOrWhiteSpace(Responsable))
                //        return "El campo Razon Social es requerido";
                //    else if (10 > Responsable.Length)
                //        return "El campo Responsable Legal debe " +
                //               "contener más de 10 caracteres";
                //    break;
                //case "Telefono":
                //    if (string.IsNullOrWhiteSpace(Telefono))
                //        return "El campo Telefono es requerido";
                //    break;
                //case "Correo":
                //    if (string.IsNullOrWhiteSpace(Correo))
                //        return "El campo Correo Electrónico es requerido \n ej: notengo@gmail.com";
                //    else if (5 > Correo.Length)
                //        return "El campo Correo Electrónico debe "
                //            + "contener más de 15 caracteres";
                //    else
                //    {
                //        Regex regEx;
                //        regEx = new Regex(@"^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\." +
                //            @"(\w{2}|(com|net|org|edu|int|mil|gov|arpa|" +
                //            @"biz|aero|name|coop|info|pro|museum))$");
                //        if (!regEx.IsMatch(Correo))
                //            return "El campo Correo Electrónico no " +
                //                   "tiene un formato correcto \n ej: notengo@gmail.com";
                //    }
                //    break;
                //case "Web":
                //    if (string.IsNullOrWhiteSpace(Web))
                //        return "El campo Pagina Web es requerido \n ej: www.notengo.com";
                //    else
                //    {
                //        Regex regEx;
                //        regEx = new Regex(@"^(www|http:\/\/)(.*\.(com$|com.ar$|net$|org$))");
                //        if (!regEx.IsMatch(Web))
                //            return "El campo Pagina Web no " +
                //                   "tiene un formato correcto \n ej: www.notengo.com";
                //    }
                //    break;
                //case "Contacto":
                //    if (string.IsNullOrWhiteSpace(Contacto))
                //        return "El campo Nombre es requerido";
                //    else if (10 > Contacto.Length)
                //        return "El campo Responsable Legal no debe " +
                //            "contener más de 10 caracteres";
                //    break;
                //case "Direccion":
                //    if (string.IsNullOrWhiteSpace(Direccion))
                //        return "El campo Dirección es requerido";
                //    else if (10 > Direccion.Length)
                //        return "El campo Dirección debe " +
                //            "contener más de 10 caracteres";
                //    break;
                //case "NroDni":
                //    if (string.IsNullOrWhiteSpace(NroDni))
                //        return "El campo Número de Documento es requerido \n ej: 23.489.345 o 23489345";
                //    else
                //    {
                //        Regex regEx;
                //        regEx = new Regex(@"^[0-9]{1,3}\.[0-9]{3}\.[0-9]{3}|^[0-9]{8,9}$");
                //        if (!regEx.IsMatch(NroDni))
                //            return "El campo Número de Documento no " +
                //                   "tiene un formato correcto \n ej: 23.489.345 o 23489345";
                //    }
                //    break;
                //case "Nrocontrib":
                //    if (string.IsNullOrWhiteSpace(Nrocontrib))
                //        return "El campo Número de Contribución es requerido \n ej: 27-23480444-0";
                //    else
                //    {
                //        Regex regEx;
                //        regEx = new Regex(@"^[0-9]{2}\-[0-9]{7,9}\-[0-9]{1}$");
                //        if (!regEx.IsMatch(Nrocontrib))
                //            return "El campo Número de Contribución no \n" +
                //                   "tiene un formato correcto \n ej:  27-23480444-0";
                //    }
                //    break;
                //case "CodigoPostal":
                //    if (string.IsNullOrWhiteSpace(CodigoPostal))
                //        return "El campo Codigo Postal es requerido - ej: 3000";
                //    else
                //    {
                //        Regex regEx;
                //        regEx = new Regex(@"^[0-9]{4}$");
                //        if (!regEx.IsMatch(CodigoPostal))
                //            return "El campo Codigo Postal no " +
                //                   "tiene un formato correcto \n ej:3000";
                //    }
                //    break;
            }
            return null;
        }        

        public bool IsValid()
        {
            return string.IsNullOrEmpty(IsValid("DetalleTipoFact"));
            //    && string.IsNullOrEmpty(IsValid("Responsable"))
            //    && string.IsNullOrEmpty(IsValid("Telefono"))
            //    && string.IsNullOrEmpty(IsValid("Correo"))
            //    && string.IsNullOrEmpty(IsValid("Web"))
            //    && string.IsNullOrEmpty(IsValid("Contacto"))
            //    && string.IsNullOrEmpty(IsValid("Direccion"))
            //    && string.IsNullOrEmpty(IsValid("NroDni"))
            //    && string.IsNullOrEmpty(IsValid("Nrocontrib"))
            //    && string.IsNullOrEmpty(IsValid("CodigoPostal"));
        }

        #endregion metodos de validacion

        #region auxiliares

        //podria crear un diccionario para agrupar los montos por clave de Iva
        public void determinaSubtotal()
        {
            Pie.Subtotal = 0;
            foreach (ItemsFactura Item in ListaItem)
            {
                Pie.Subtotal = Pie.Subtotal + Item.Precio;                
            }
        }

        //retorna el valor de subtotal en la clase PieFactura
        public decimal valorSubtotal()
        {
            return Pie.Subtotal;
        }

        #endregion auxiliares

        //calcula los iva
       //public calculaIva ()
       //{
       //  foreach (ItemsFactura item in ListaItem)
       //  {

       //  }
       //}


    }
}
